﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.Sockets;
using System.Net;
using DevComponents.DotNetBar;
using System.Windows.Forms;
using System.Xml;
using RM2012Server.Business;
using RM2012Server.Controller;
using System.Data;

namespace RM2012Server.Model
{
    public class MyUDPServer
    {
        //Tạo một khởi tạo của lớp Log
        Log log = new Log();

        public void OnStart()
        {
            //Tạo một đối tượng UdpClient để lắng nghe cổng 2012
            UdpClient udp = new UdpClient(2012);
            //Thực hiện lắng nghe liên tục
            while(true)
            {
                //Xác định điểm truy cập Remote IP
                IPEndPoint remoteIPEndPoint = new IPEndPoint(IPAddress.Any, 0);
                //Nhận thông tin từ Client dưới dạng Byte
                Byte[] data = udp.Receive(ref remoteIPEndPoint);
                //Chuyển về String
                String message = Encoding.Unicode.GetString(data, 0, data.Length);
                //Xử lý công việc ứng với Message nhận được từ Client
                MessageInfo messageInfo = new MessageInfo();
                XmlDocument docMessage = XML.CreateXMLDocument(message);
                XmlElement root = docMessage.DocumentElement;
                XmlNode nodeTables = root.SelectSingleNode("Tables");
                XmlNode nodeInvoice = root.SelectSingleNode("Invoice");
                XmlNode nodeMenu = root.SelectSingleNode("Menu");
                XmlNode nodeWorking = root.SelectSingleNode("Working");
                XmlNode nodeQuantity = root.SelectSingleNode("Quantity");
                XmlNode nodeUserInfo = root.SelectSingleNode("UserInfo");
                XmlNode nodeTime = root.SelectSingleNode("Time");

                //Lấy thông tin đưa vào MessageInfo object
                messageInfo.TablesId = nodeTables.SelectSingleNode("TablesId").InnerText;
                messageInfo.TablesName = nodeTables.SelectSingleNode("TablesName").InnerText;
                messageInfo.InvoiceId = nodeInvoice.SelectSingleNode("InvoiceId").InnerText;
                messageInfo.MenuId = nodeMenu.SelectSingleNode("MenuId").InnerText;
                messageInfo.MenuName = nodeMenu.SelectSingleNode("MenuName").InnerText;
                messageInfo.ObjectsName = nodeWorking.SelectSingleNode("Objects").InnerText;
                messageInfo.ActionName = nodeWorking.SelectSingleNode("Action").InnerText;
                messageInfo.NumOld = nodeQuantity.SelectSingleNode("NumericOld").InnerText;
                messageInfo.NumNew = nodeQuantity.SelectSingleNode("NumericNew").InnerText;
                messageInfo.UserName = nodeUserInfo.SelectSingleNode("UserName").InnerText;
                messageInfo.FullName = nodeUserInfo.SelectSingleNode("FullName").InnerText;
                messageInfo.GroupName = nodeUserInfo.SelectSingleNode("GroupName").InnerText;
                messageInfo.Time = nodeTime.InnerText;

                //Ghi vào nhật ký các thao tác của Client
                DoLog(messageInfo);

                #region TempInfo
                //string test = "TablesId - " + messageInfo.TablesId + Environment.NewLine;
                //test = test + "TablesName - " + messageInfo.TablesName + Environment.NewLine;
                //test = test + "InvoiceId - " + messageInfo.InvoiceId + Environment.NewLine;
                //test = test + "MenuId - " + messageInfo.MenuId + Environment.NewLine;
                //test = test + "MenuName - " + messageInfo.MenuName + Environment.NewLine;
                //test = test + "ObjectsName - " + messageInfo.ObjectsName + Environment.NewLine;
                //test = test + "ActionName - " + messageInfo.ActionName + Environment.NewLine;
                //test = test + "NumOld - " + messageInfo.NumOld + Environment.NewLine;
                //test = test + "NumNew - " + messageInfo.NumNew + Environment.NewLine;
                //test = test + "UserName - " + messageInfo.UserName + Environment.NewLine;
                //test = test + "FullName - " + messageInfo.FullName + Environment.NewLine;
                //test = test + "GroupName - " + messageInfo.GroupName + Environment.NewLine;
                //test = test + "Time - " + messageInfo.Time + Environment.NewLine;
                //MessageBoxEx.Show(test);
                //if (message.Equals("shutdown"))
                //{
                //    Function.ShutDown();
                //}
                //else if (message.Equals("restart"))
                //{
                //    Function.ReStart();
                //}
                //else if (message.Equals("logoff"))
                //{
                //    Function.LogOff();
                //}
                //else if (message.Equals("noticeAddInvoice"))
                //{
                //    MessageBoxEx.Show("Có yêu cầu phục vụ mới của khách hàng !");
                //}
                //else
                //{
                //    MessageBoxEx.Show(message, "Client Message");
                //}
                #endregion
            }
        }

        public String StaffInfo(MessageInfo info)
        {
            String _staff = "";
            _staff = _staff + "(" + info.GroupName + " " + info.FullName + " - TK : " + info.UserName + ")";
            return _staff;
        }

        public String GetTime(String str)
        {
            //2011 04 26 16 52 43
            String _year = str.Substring(0, 4);
            String _month = str.Substring(4, 2);
            String _day = str.Substring(6, 2);
            String _hour = str.Substring(8, 2);
            String _minute = str.Substring(10, 2);
            String _second = str.Substring(12);
            String time = _hour + " : " + _minute + " : " + _second + " ngày " + _day + "/" + _month + "/" + _year;
            return time;
        }

        public String GetDateOfMessage(String str)
        {
            //2011 04 26 16 52 43
            return str.Substring(0, 8);
        }

        public void DoLog(MessageInfo info)
        {
            String time = GetTime(info.Time);
            String staffInfo = StaffInfo(info);
            String _fileName = "Log_" + GetDateOfMessage(info.Time) + ".txt";
            String messageLog = "";
            //String messageTemp = "********************************************************************************";
            String messageTemp = "----------------------------------------------------------------------------------------------------";
            if (info.ObjectsName.Equals("PAY"))
            {
                //Viết vào nhật ký và thông báo lên màn hình
                if (info.ActionName.Equals("REQUEST"))
                {
                    messageLog = info.TablesName + " : Yêu cầu thanh toán lúc " + time + " " + staffInfo + ".";
                    //Ghi vào nhật ký của hệ thống
                    bool b1 = log.WriteLog(_fileName, messageLog);
                    bool b2 = log.WriteLog(_fileName, messageTemp);
                    //Thông báo lên màn hình
                    MessageBoxEx.Show(messageLog, "TIN NHẮN HỆ THỐNG");
                }
            }
            else if (info.ObjectsName.Equals("INVOICE"))
            {
                //Viết vào nhật ký và thông báo lên màn hình
                if (info.ActionName.Equals("ADD"))
                {
                    messageLog = info.TablesName + " : Bắt đầu phục vụ khách lúc " + time + " " + staffInfo + ".";
                    //Ghi vào nhật ký của hệ thống
                    bool b3 = log.WriteLog(_fileName, messageLog);
                    bool b4 = log.WriteLog(_fileName, messageTemp);
                    //Thông báo lên màn hình
                    MessageBoxEx.Show(messageLog, "TIN NHẮN HỆ THỐNG");
                }
            }
            else if (info.ObjectsName.Equals("MENU"))
            {
                //Chỉ viết vào nhật ký hệ thống
                String unitId = new MenuCtrl().GetUnitId(info.MenuId);
                DataTable dtUnit = new UnitCtrl().GetById(unitId);
                String unitName = dtUnit.Rows[0]["UnitName"].ToString();

                if (info.ActionName.Equals("ADD"))
                {
                    messageLog = info.TablesName + " : Thêm mới " + info.NumNew + " " + unitName + " " + info.MenuName + " lúc " + time + " " + staffInfo + ".";
                }
                else if (info.ActionName.Equals("UPDATE"))
                {
                    messageLog = info.TablesName + " : Thêm tiếp " + info.NumNew + " " + unitName + " " + info.MenuName + " lúc " + time + " " + staffInfo + ".";
                }
                else if (info.ActionName.Equals("DELETE"))
                {
                    //Đề phòng nhân viên rút tiền của nhà hàng (trên thực tế)
                    messageLog = info.TablesName + " : Hủy món " + info.MenuName + " lúc " + time + " " + staffInfo + ".";
                }
                //Ghi vào nhật ký của hệ thống
                bool b5 = log.WriteLog(_fileName, messageLog);
                bool b6 = log.WriteLog(_fileName, messageTemp);
            }
        }
    }
}
